#ifndef HISTORYDIALOG_H
#define HISTORYDIALOG_H

#include <QDateTimeEdit>
#include <QDialog>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QRadioButton>
#include "Style.h"
#include "Model/Data.h"

//////////////////////////////////////////
/// 点击历史按钮时显示的窗口
/// 支持按关键字查询和按时间查询
//////////////////////////////////////////
class HistoryDialog : public QDialog
{
public:
    HistoryDialog(QWidget* parent = nullptr);
    void init_base_ui();
    void init_scroll_area_ui();
    void connect_signals();
    void handle_clicked_search_btn();
    void handle_date_changed();
    void add_item(const model::Message& msg);
    void clear();
private:
    const QString  SCROLL_STYLE         = get_scroll_area_style();
    const QString  DATE_TIME_EDIT_STYLE = get_date_time_edit_style();
    QGridLayout*   g_layout;          // 整体使用的布局管理器
    QVBoxLayout*   v_layout_scroll;   // 滚动区域使用的布局管理器
    QRadioButton*  keyword_radio;     // 按关键字查询单选按钮
    QRadioButton*  time_radio;        // 按时间查询单选按钮
    QLineEdit*     line_edit;         // 搜索框
    QPushButton*   search_btn;        // 搜索按钮
    QLabel*        start_time_label;  // 起始时间标签
    QLabel*        end_time_label;    // 结束时间标签
    QDateTimeEdit* start_time;        // 起始时间选择器
    QDateTimeEdit* end_time;          // 结束时间选择器
    QSpacerItem*   spacer_item;       // 用于单选按钮之间的间距
};

//////////////////////////////////////////
/// HistoryDialog 使用的一条一条的item
//////////////////////////////////////////
class HistoryDialogItem : public QWidget
{
public:
    HistoryDialogItem() = default;
    static HistoryDialogItem* make_history_item(const model::Message& msg);
};

///////////////////////////////////////
/// 图片Button, 用于显示图片消息
///////////////////////////////////////
class ImageButton : public QPushButton
{
public:
    ImageButton(const model::Message& msg);
private:
    void update_content(const QString& file_id, const QByteArray& image_data);
private:
    QString file_id;
    QByteArray image_data;
};
///////////////////////////////////////
/// 用于显示文件消息的Label
///////////////////////////////////////
class FileLabel : public QLabel
{
public:
    FileLabel(const model::Message& msg);
protected:
    void mousePressEvent(QMouseEvent* event) override;
private:
    void update_content(const QString& file_id, const QByteArray& file_content);
private:
    QString file_id;
    QString file_name;
    QByteArray file_data;
};

///////////////////////////////////////
/// 用于显示语音消息的Label
///////////////////////////////////////
class SpeechLabel : public QLabel
{
public:
    SpeechLabel(const model::Message& msg);
protected:
    void mousePressEvent(QMouseEvent* event) override;
private:
    void update_content(const QString& file_id, const QByteArray& speech_content);
private:
    QString file_id;
    QByteArray speech_data;

};
#endif  // HISTORYDIALOG_H
